/* Copyright (C) 2021 Rain */

/* This file is part of XNIX. */

/* 
  XNIX is free software: you can redistribute it and/or modify 
  it under the terms of the GNU General Public License as published by 
  the Free Software Foundation, either version 3 of the License, or 
  (at your option) and later version. 
*/

/*
  XNIX is distributed in the hope that it will be useful, 
  but WITHOUT ANY WARRANTY; without even the implied warranty of 
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
  GNU General Public License for more details. 
*/

/*
  You should have received a copy of the GNU General Public License 
   along with XNIX. If not, see <https://www.gnu.org/licenses/>.  
*/



#ifndef _INT_H
#define _INT_H


struct idt_entry {
	__uint16_t off_0_16;
	__uint16_t selector;
	__uint8_t ist;
	/* attr: P + DPL + TYPE */
	__uint8_t attr;
	__uint16_t off_16_32;

	__uint32_t off_32_64;
	__uint32_t zero;
} __attribute__ ((packed));


/* 16B per entry, 256 entries */
extern struct idt_entry idt_table[];

int int_init(void);
void set_gate(struct idt_entry *, char, char, void *);
void syscall(void);

/* functions in int.S */
void divide_error(void);


#define set_int_gate(nr, ist, handler)	set_gate(nr, 0x8e, ist, handler)
#define set_trap_gate(nr, ist, handler)	set_gate(nr, 0x8f, ist, handler)
#define set_sys_gate(nr, ist, handler)	set_gate(nr, 0xef, ist, handler)


/* control word */
#define PIC0_ICW1 0x0020
#define PIC0_OCW2 0x0020

/* interrupt mask register */
#define PIC0_IMR  0x0021

#define PIC0_ICW2 0X0021
#define PIC0_ICW3 0X0021
#define PIC0_ICW4 0X0021

#define PIC1_ICW1 0x00a0
#define PIC1_OCW2 0x00a0

#define PIC1_IMR  0x00a1

#define PIC1_ICW2 0x00a1
#define PIC1_ICW3 0x00a1
#define PIC1_ICW4 0x00a1



#endif
